package com.future.future.commons.valid.constraintValidator;



import com.future.future.commons.valid.annotation.ListValue;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.HashSet;
import java.util.Set;

/**
 * @Author: shinan
 * @Version: 1.8
 * @create: 2020/12/31 14:16
 * @Description: ListValue校验注解使用的校验器 校验Integer类型的数据
 * <p>
 * ConstraintValidator<A extends Annotation, T> 接口说明:
 * 》两个泛型
 * 》A extends Annotation 指定该校验器校验的是哪一个注解
 * 》T 指定校验的数据类型
 */
public class ListValueConstraintValidatorForInteger implements ConstraintValidator<ListValue, Integer> {

    private Set<Integer> set = new HashSet<>();

    /**
     * 初始化注解 可以获取该注解的详细信息
     *
     * @param constraintAnnotation 可以获取使用@ListValue注解时
     *                             通过values属性指定的值
     *                             这些值就是被标记的字段可以使用的值
     */
    @Override
    public void initialize(ListValue constraintAnnotation) {

        //1.获被标记字段可以使用的值
        int[] values = constraintAnnotation.values();

        //2.遍历并保存到set中 用来在isValid()方法中进行校验
        for (Integer value : values) {
            set.add(value);
        }
    }

    /**
     * 判断是否校验成功
     *
     * @param value   被@ListValue注解标记的字段的值  即需要被校验的值
     * @param context 校验的上下文环境信息
     * @return 是否通过校验
     */
    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext context) {

        //判断被校验的值是否在允许使用的范围内
        return set.contains(value);
    }
}